package controllers

import (
	"blog-backend/internal/app/dtos"
	"blog-backend/internal/app/services"
	"blog-backend/internal/utils"
	"net/http"

	"github.com/gin-gonic/gin"
)

type AuthController struct {
	authService *services.AuthService
}

func NewAuthController() *AuthController {
	return &AuthController{
		authService: services.NewAuthService(),
	}
}

// Register 用户注册
// @Summary 用户注册
// @Description 创建新用户
// @Tags 认证
// @Accept json
// @Produce json
// @Param register body dtos.RegisterDto true "注册信息"
// @Success 201 {object} dtos.SuccessResponse{data=dtos.UserProfile} "注册成功"
// @Failure 400 {object} dtos.ErrorResponse "请求参数错误"
// @Failure 409 {object} dtos.ErrorResponse "用户名或邮箱已存在"
// @Failure 500 {object} dtos.ErrorResponse "服务器内部错误"
// @Router /api/auth/register [post]
func (c *AuthController) Register(ctx *gin.Context) {
	var dto dtos.RegisterDto
	if err := ctx.ShouldBindJSON(&dto); err != nil {
		utils.RespondError(ctx, http.StatusBadRequest, err.Error())
		return
	}

	user, err := c.authService.Register(dto)
	if err != nil {
		utils.RespondError(ctx, http.StatusConflict, err.Error())
		return
	}

	// 过滤敏感信息
	user.Password = ""
	utils.RespondJSON(ctx, http.StatusCreated, dtos.SuccessResponse{
		Success: true,
		Message: "注册成功",
		Data:    user,
	})
}

// Login 用户登录
// @Summary 用户登录
// @Description 用户登录获取JWT令牌
// @Tags 认证
// @Accept json
// @Produce json
// @Param login body dtos.LoginDto true "登录凭证"
// @Success 200 {object} dtos.SuccessResponse{data=dtos.LoginResponse} "登录成功"
// @Failure 400 {object} dtos.ErrorResponse "请求参数错误"
// @Failure 401 {object} dtos.ErrorResponse "用户名或密码错误"
// @Failure 500 {object} dtos.ErrorResponse "服务器内部错误"
// @Router /api/auth/login [post]
func (c *AuthController) Login(ctx *gin.Context) {
	var dto dtos.LoginDto
	if err := ctx.ShouldBindJSON(&dto); err != nil {
		utils.RespondError(ctx, http.StatusBadRequest, err.Error())
		return
	}

	token, user, err := c.authService.Login(dto)
	if err != nil {
		utils.RespondError(ctx, http.StatusUnauthorized, "用户名或密码错误")
		return
	}

	// 过滤敏感信息
	user.Password = ""
	userProfile := dtos.UserProfile{
		ID:       user.ID,
		Username: user.Username,
		Email:    user.Email,
		Avatar:   user.Avatar,
		// Add other fields as needed
	}
	utils.RespondJSON(ctx, http.StatusOK, dtos.SuccessResponse{
		Success: true,
		Message: "登录成功",
		Data: dtos.LoginResponse{
			Token: token,
			User:  userProfile,
		},
	})
}

// Profile 获取用户信息
// @Summary 获取用户信息
// @Description 获取当前登录用户信息
// @Tags 认证
// @Produce json
// @Security Bearer
// @Success 200 {object} dtos.SuccessResponse{data=dtos.UserProfile} "获取成功"
// @Failure 401 {object} dtos.ErrorResponse "未认证"
// @Failure 500 {object} dtos.ErrorResponse "服务器内部错误"
// @Router /api/auth/profile [get]
func (c *AuthController) Profile(ctx *gin.Context) {
	userID := ctx.MustGet("userID").(uint)
	
	user, err := c.authService.GetProfile(userID)
	if err != nil {
		utils.RespondError(ctx, http.StatusInternalServerError, err.Error())
		return
	}
	
	utils.RespondJSON(ctx, http.StatusOK, dtos.SuccessResponse{
		Success: true,
		Message: "获取用户信息成功",
		Data:    user,
	})
}

// UpdateProfile 更新用户信息
// @Summary 更新用户信息
// @Description 更新当前登录用户信息
// @Tags 认证
// @Accept json
// @Produce json
// @Security Bearer
// @Param profile body dtos.UpdateProfileDto true "更新信息"
// @Success 200 {object} dtos.SuccessResponse{data=dtos.UserProfile} "更新成功"
// @Failure 400 {object} dtos.ErrorResponse "请求参数错误"
// @Failure 401 {object} dtos.ErrorResponse "未认证"
// @Failure 409 {object} dtos.ErrorResponse "用户名已被使用"
// @Failure 500 {object} dtos.ErrorResponse "服务器内部错误"
// @Router /api/auth/profile [put]
func (c *AuthController) UpdateProfile(ctx *gin.Context) {
	userID := ctx.MustGet("userID").(uint)
	
	var dto dtos.UpdateProfileDto
	if err := ctx.ShouldBindJSON(&dto); err != nil {
		utils.RespondError(ctx, http.StatusBadRequest, err.Error())
		return
	}
	
	user, err := c.authService.UpdateProfile(userID, dto)
	if err != nil {
		utils.RespondError(ctx, http.StatusConflict, err.Error())
		return
	}
	
	utils.RespondJSON(ctx, http.StatusOK, dtos.SuccessResponse{
		Success: true,
		Message: "更新用户信息成功",
		Data:    user,
	})
}